# service/parse/upload_interface.py
import io
from abc import ABC, abstractmethod


class OssObject:

    def __init__(self, bucket_name: str, object_id: str):
        self.bucket_name = bucket_name
        self.object_id = object_id

    def to_dict(self):
        return {
            'bucket_name': self.bucket_name,
            'object_id': self.object_id
        }


class OssApi(ABC):

    @abstractmethod
    def upload(self, filename: str, stream: io.IOBase) -> OssObject:
        """
        上传文件到存储服务。

        参数:
        - filename: 文件名
        - stream: io.IOBase 对象，表示上传的文件。

        返回:
        - OssObject 对象，包含桶名称和对象 ID。
        """
        pass

    @abstractmethod
    def upload_to_bucket(self, bucket_name: str, filename: str, stream: io.IOBase) -> OssObject:
        """
        上传文件到存储服务。

        参数:
        - bucket_name: bucket名称
        - filename: 文件名
        - stream: io.IOBase 对象，表示上传的文件。

        返回:
        - OssObject 对象，包含桶名称和对象 ID。
        """
        pass

    @abstractmethod
    def get_object(self, object_id: str) -> io.IOBase:
        """
        从存储服务中获取对象
        :param object_id: 对象id
        :return: io.IOBase 对象，表示获取的文件
        """
        pass

    @abstractmethod
    def get_object_from_bucket(self, bucket_name: str, object_id: str) -> io.IOBase:
        """
        从存储服务中获取对象。

        参数:
        - bucket_name: bucket名称
        - object_id: 对象 ID

        返回:
        - io.IOBase 对象，表示获取的文件。
        """
        pass
